#!/bin/bash

# 脚本功能：终止所有与SMS验证服务相关的进程
# 使用方法：bash kill_existing_processes.sh

# 设置颜色变量
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # No Color

echo -e "${YELLOW}开始清理SMS验证服务相关进程...${NC}"

# 函数：终止进程
kill_process() {
  local PID=$1
  local DESC=$2
  
  if ps -p $PID > /dev/null; then
    echo -e "${YELLOW}正在终止${DESC}进程: $PID${NC}"
    kill -15 $PID 2>/dev/null || true
    sleep 2
    
    # 检查进程是否成功终止
    if ps -p $PID > /dev/null; then
      echo -e "${RED}进程未正常终止，尝试强制终止: $PID${NC}"
      kill -9 $PID 2>/dev/null || true
      sleep 1
    fi
    
    # 再次检查
    if ! ps -p $PID > /dev/null; then
      echo -e "${GREEN}进程已成功终止: $PID${NC}"
    else
      echo -e "${RED}警告：无法终止进程: $PID${NC}"
    fi
  fi
}

# 1. 通过PID文件终止进程
if [ -f "app.pid" ]; then
  echo -e "${YELLOW}发现PID文件，尝试通过PID文件终止进程${NC}"
  PID=$(cat app.pid)
  kill_process $PID "通过PID文件"
  rm -f app.pid
  echo -e "${GREEN}已删除PID文件${NC}"
fi

# 2. 查找并终止监听8090和8091端口的进程
echo -e "${YELLOW}查找监听8090和8091端口的进程${NC}"

# 函数：查找并终止指定端口的进程
terminate_port_processes() {
  local PORT=$1
  echo -e "${YELLOW}  查找监听$PORT端口的进程${NC}"
  
  local PORT_PIDS=""
  # 兼容不同的操作系统命令
  if command -v lsof > /dev/null; then
    # Linux/macOS系统使用lsof
    PORT_PIDS=$(lsof -t -i:$PORT 2>/dev/null)
  elif command -v netstat > /dev/null; then
    # 某些Linux系统使用netstat
    PORT_PIDS=$(netstat -tulpn 2>/dev/null | grep :$PORT | awk '{print $7}' | awk -F'/' '{print $1}')
  elif command -v ss > /dev/null; then
    # 某些Linux系统使用ss
    PORT_PIDS=$(ss -tulpn 2>/dev/null | grep :$PORT | awk '{print $7}' | awk -F'/' '{print $1}')
  fi
  
  if [ -n "$PORT_PIDS" ]; then
    for PID in $PORT_PIDS; do
      if [[ $PID =~ ^[0-9]+$ ]]; then
        kill_process $PID "监听$PORT端口"
      fi
    done
  else
    echo -e "${GREEN}  未发现监听$PORT端口的进程${NC}"
  fi
}

# 终止两个端口的进程
terminate_port_processes 8090
terminate_port_processes 8091

# 3. 查找并终止Gunicorn进程
echo -e "${YELLOW}查找与Gunicorn相关的进程${NC}"
GUNICORN_PIDS=$(ps aux | grep "[g]unicorn" | grep -v "grep" | awk '{print $2}')

if [ -n "$GUNICORN_PIDS" ]; then
  for PID in $GUNICORN_PIDS; do
    if [[ $PID =~ ^[0-9]+$ ]]; then
      kill_process $PID "Gunicorn"
    fi
  done
else
  echo -e "${GREEN}未发现Gunicorn进程${NC}"
fi

# 4. 查找并终止与wsgi:app相关的进程
echo -e "${YELLOW}查找与wsgi:app相关的进程${NC}"
WSGI_PIDS=$(ps aux | grep "[w]sgi:app" | grep -v "grep" | awk '{print $2}')

if [ -n "$WSGI_PIDS" ]; then
  for PID in $WSGI_PIDS; do
    if [[ $PID =~ ^[0-9]+$ ]]; then
      kill_process $PID "wsgi:app"
    fi
  done
else
  echo -e "${GREEN}未发现与wsgi:app相关的进程${NC}"
fi

echo -e "${GREEN}进程清理完成！${NC}"
echo -e "${YELLOW}提示：现在可以安全启动新的服务了${NC}"